# cython: language_level=3
import json
import os
from typing import Any, Dict, List

from dotenv import load_dotenv
from fastapi import APIRouter, Depends   #与APIRouter有关
from sqlalchemy import select
from sqlalchemy.orm import Session

from app.db.redis.invitation import get_response_plan_from_redis
from app.db.sql.day_ahead_plan import save_dayahead_plan
from app.db.sql.invitation import save_invitations
from app.db.sql.resource import get_real_time_data
from app.db.sql.vpp_plan import save_vpp_plan
from app.db.sql.vpp_price import save_vpp_price
from app.middlewares.redis import get_redis
from app.models.base_line import BaseLine
from app.models.invitation import Invitation
from app.models.mr_line import MrLine
from app.schemas.platform import (
    GetInvitationRequest,
    SendRealTimeDataRequest,
    SendReponsePlanRequest,
    GetDayaheadPlanRequest,
)
from common.database import get_db
from common.http import error_response, ok_response, show_response
from common.log import get_logger
from common.redis import MyRedis
from common.time import get_datetime_now
# web界面的接口全部在此标签下
router = APIRouter(tags=["web"])
# ywy
logger = get_logger("server")
# 加上这个就需要认证，如果只是开发个界面可以不加，应该是浩哥在v2这个模块上处理的
# logger = logging.getLogger("fastapi")
# router.prefix = "/v2"
# 



def save_invitation_payload(payload: GetInvitationRequest):
    global invitation_payload_temp
    invitation_payload_temp = payload
    return invitation_payload_temp
""" 
    返回邀约的信息时，不应该就是简单返回邀约的普通信息，
    但是邀约信息之前另一个接口又已经返回过了
    应该是在前端网页提供信息接口，如果主站需要聚合商上报数据了，那网页的这个接口应该跳转到主站邀约的具体内容（或者将这部分内容标红呀什么的
    然后网页还得提供一个信息录入接口，给聚合商填上报信息，比如vppprice、vppplan、responseplan
"""
# def save_sendreponse_payload(payload: SendReponsePlanRequest):
#     global payload_temp
#     payload_temp = payload
#     return payload_temp
# 2.4负荷聚合商接收虚拟电厂邀约接口展示
@router.get("/show_invitation")
# 用临时变量储存的话，由于临时变量每一次都会被覆盖，所所以临时变量只能保存一条数据，当然临时数组可能可以，但是没必要，直接从数据库拿数据就好了
# 通过在依赖的模块中定义全局变量，在前端1的路由函数中，将数据储存到全局变量，在前端2的函数中返回。注意在各个模块中用到依赖的模块，都需要导入
def show_invitation(db:Session = Depends(get_db)):
    temp_invitation=[]
    results=db.scalars(select(Invitation)).all()
    for result in results:
        # 只返回前端需要显示的有效的信息
        temp_invitation.append(
            {
            "eventType": "invitation",
            "invitationId": result.invitation_id,
            "invitationTime": result.invitation_time,
            "exchangeType": result.exchange_type, 
            "replyTime": result.reply_time,
        })
        # temp_totalPage=int(len(results)/10)
        # temp_totalPage=1
    logger.debug("总共多少页")
    # logger.debug(temp_totalPage)
    # return show_response(totalPage=temp_totalPage,data=temp_invitation)
    return ok_response(data=temp_invitation)
"""
2.41展示基线和需求
"""

@router.post("/show_invitationline")
def show_invitation(invitationId:str,db:Session = Depends(get_db)):
    logger.debug(f"linvitation是{invitationId}")
    
    results = []
    results1=[]
    results2=[]
    # 查询 base_line 表
    baseline=[]
    base_line_query = db.query(BaseLine).filter(BaseLine.invitation_id == invitationId).all()
    for bl in base_line_query:
        baseline.append({
            "resourceId": bl.resource_id,
            "key": bl.key,
            "value": bl.value
        })
    print(f"baseline是{baseline}")
    """
 删掉无效的数据，得到
{
			"key": "00:15",
			"value": 10.14,
			"resource_id": "0945000048807386",


		},
		{
			"key": "00:30",
			"value": 10.75,
			"resource_id": "0945000048807386",

		},

取得所有的resourceId放在temp_resourceId中"""
    temp_resourceId=[]
    for item in baseline:
        if item["resourceId"] not in temp_resourceId:
            temp_resourceId.append(item["resourceId"])
    # print(f"temp_resourceId是{temp_resourceId}")


    # 使用字典来存储每个 resourceId 的数据,
    """这样会得到一个字典，其中 key 是 resourceId，value 是一个列表，列表中的每个元素都是一个字典，
    这个字典包含了 resourceId 对应的 resource_id、value、key 等信息。
    比如：
    resourceId是{'3945000048807381': {'resourceId': '3945000048807381', '00:15': Decimal('120.11'), '00:30': Decimal('110.71')}, 
    '2945000048815711': {'resourceId': '2945000048815711', '00:15': Decimal('110.11'), '00:00': Decimal('130.71'), '01:00': Decimal('123.21')}}
    """
    resource_data = {}
    for resourceId in temp_resourceId:
        for item in baseline:
            if item["resourceId"] == resourceId:
                # 如果 resourceId 尚未在 resource_data 中，则添加一个新的条目
                if resourceId not in resource_data:
                    resource_data[resourceId] = {"resourceId": resourceId}
                
                # 直接添加键值对到对应的 resourceId 条目中
                resource_data[resourceId][item["key"]] = item["value"]
    print(f"resourceId是{resource_data}")

    # 将 resource_data 转换为列表
    results1 = list(resource_data.values())

                
    print(f"results1是{results1}")


        # 查询 mr_line 表,将表中的每一列放在一个字典里，作为数组的每一个元素
    mr_line_query = db.query(MrLine).filter(MrLine.invitation_id == invitationId).all()
# 将result2(列表）返回前端
    """ [
		{
			"00:45": -501
		},
		{
			"00:60": -601
		}
	]
        """
    for item in mr_line_query:
        results2.append({item.key: item.value})

# 将mrline_data（字典）返回前端
    """	"mr_line": {
			"00:45": -501,
			"00:60": -601
		}
        """    
    mr_line_data = {}
    for item in results2:
        mr_line_data.update(item)

    # results2 = list(mr_line_data.values())
    # 将两个查询结果合并到一个列表中,同时把invitationId也放上去
    results = {"base_line": results1, "mr_line": mr_line_data,"invitationId": invitationId}
    # logger.debug(f"line是{results1}")
    return ok_response(results)







    """
    向聚合商网页发送主站邀约信息，示例如下
    {
        "systemTime": "2021-07-12 08:12:00",
        "creditCode": "91440300552132052H",
        "eventType": "invitation",
        "invitationId": "20220225削峰计划",
        "invitationTime": "2022-02-24 16:30:00",
        "exchangeType": "RQXF",
        "page": 1,
        "totalPage": 1,
        "replyTime": "2022-02-24 19:30:00",
        "startTime": "2022-02-25 11:00:00",
        "endTime": "2022-02-25 11:30:00",
        "mrLine": {
                "00:15": -500,
                "00:30": -500
        },
        "inviteRange": "0945000048807386,0945000048815712",
        "baseLine": [
            {
                "resourceId": "0945000048807386",
                "00:15": 10.14,
                "00:30": 10.75
            },
            {
                "resourceId": "0945000048815712",
                "00:15": 10.14,
                "00:00": 10.75
            }
        ]
    }
    baseLine 中的 时间 是指的在此之前的 15分钟 平均功率值
    """

# 2.5负荷聚合商上报计划曲线和价格接口
@router.post("/show_dayahead_plan")
def show_dayahead_plan(payload: GetDayaheadPlanRequest, db: Session = Depends(get_db)):
    # 1.保存计划
    save_dayahead_plan(db, payload)
    # 2.保存价格
    save_vpp_price(db, payload)
    # 3.保存计划
    save_vpp_plan(db, payload)
    return ok_response(data=payload)





